package spring.mvc;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.me.study.javaCore.enumm.ColorEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.time.LocalDateTime;
import java.util.Date;

/**
 * 1，测试 SpringMVC 中自带的 String、Integer 与 枚举 的类型转换功能
 * 2，测试 @DateTimeFormat 到底什么时候生效
 *
 * @author ME
 * @date   2020/1/9
 */
@Controller
// @ResponseBody
public class MyController {
@Autowired
private ApplicationContext applicationContext;
    /**
     * TODO LocalDateTime 可以格式化为 `yyyy-MM-dd`。但是反回来，前端传 `yyyy-MM-dd` 无法解析为 LocalDateTime
     *
     *
     * 解析 【表单参数、url请求参数】里的 日期字符串（非 json类型）时，注解 @DateTimeFormat 生效，格式化输出目前没遇到使用场景：<br>
     *  http://localhost:8080/dateFormat?date=2021-10-24%2017:55
     *
     * @return
     */
    @RequestMapping(value = "/dateFormat")
    @ResponseBody
    public Entity dateFormat(Entity entity) {
        System.out.println("\n@DateTimeFormat 接收【表单、url请求参数】里的 时间字符串: " + entity.getDate());

        // entity.setDate(new Date());
        return entity;
    }

    /**
     * 解析【json 请求体】里的时间字符串会应用 @JsonFormat 模板，     <p>
     * 并且 @ResponseBody 输出 json格式的响应时也会应用于 日期格式化      <p></p>
     *
     *  http://localhost:8080/jsonFormat
     *
     * @return
     */
    @RequestMapping(value = "/jsonFormat")
    @ResponseBody
    public Entity jsonFormat(@RequestBody Entity entity) {
        System.out.println("\n@JsonFormat 接收【请求体】里的 时间字符串: " + entity.getDate());

        // entity.setDate(new Date());
        return entity;
    }

    /**
     * 请求入参 转 枚举类型（ Spring 内置 StringToEnum、IntegerToEnum），使用如下请求测试：<p>
     *  http://127.0.0.1:8080/str2enum?color=RED
     *
     * @return
     */
    @RequestMapping(value = "/str2enum", produces = {"text/plain;charset=UTF-8", "text/html;charset=UTF-8"})
    @ResponseBody
    public String str2Enum(@RequestParam("color") ColorEnum colorEnum) {
        System.out.println("/str2enum displayName: " + colorEnum.getDesc());
        return colorEnum.getDesc();
    }

    /**
     * 请求入参 转 枚举类型（ Spring 内置 StringToEnum、IntegerToEnum），使用如下请求测试：<p>
     *  http://127.0.0.1:8888/enum2str?color=RED        <P></P>
     *
     * @return
     */
    @RequestMapping(value = "/enum2str")
    @ResponseBody
    public ColorEnum enum2Str(@RequestParam("color") String value) {
        ColorEnum colorEnum = ColorEnum.valueOf(value);
        System.out.println("/enum2str displayName: " + colorEnum.getDesc());
        return colorEnum;
    }

    public static class Entity {
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")// 非 json 入参有效
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")// json 请求及返回有效
        private LocalDateTime date;

        public LocalDateTime getDate() {
            return date;
        }

        public void setDate(LocalDateTime date) {
            this.date = date;
        }
    }

}
